package com.sxt;

import java.util.Arrays;
import java.util.EmptyStackException;

/**自定义栈容器*/
public class MyStack<E> {
    //创建数组时不可以用泛型，定义数组可以用泛型
    //如果取元素时，将Object类型转换为泛型类型
    //成员变量
    private Object[] arr;//存放元素的物理结构
    private int stackLength = 4;//数组的默认长度
    private int size;//记录栈容器的元素个数
    private int index = -1;//操作数组下标位置的指针

    /*判断容器是否为空  return*/
    public boolean empty(){
        //判断size=0 返回true
        return this.size==0;
    }
    //获取栈顶元素
    public E pop(){
        //如果栈容器中没有元素则抛出异常
        if(this.index==-1){
            throw new EmptyStackException();
        }
        //记录元素个数
        this.size--;
        //返回栈顶元素  取后再减1
        //先将元素返回，指针再向下 原本是Object类型 强转为E类型
        return (E) this.arr[index--];
    }
    //向栈容器中添加元素  @param item     return
    public E push(E item){
        //初始化数组
        this.capacity();
        //向数组中添加元素  通过索引添加元素
        this.arr[++index]=item;
        //记录元素个数
        this.size++;
        return item;
    }
    //添加元素前先初始化数组
    //数组初始化或者以1.5倍容量对数组扩容
    private void capacity(){
        //数组初始化
        if(this.arr==null){
            this.arr=new Object[this.stackLength];
        }
       // 以1.5倍容量对数组扩容
        if(this.size-(this.stackLength-1)>=0){
            //计算用除法与取模是比较慢，所以用位移 右位移一位表示除以2 左位移一位表示乘以2
            this.stackLength = this.stackLength+(this.stackLength >>1);
            this.arr= Arrays.copyOf(this.arr,this.stackLength);
        }
    }
    public static void main(String[] args) {
        MyStack<String> myStack = new MyStack<>();
        myStack.push("a");
        myStack.push("b");
        myStack.push("c");
        myStack.push("d");
        myStack.push("e");
        myStack.push("f");
        System.out.println(myStack.size);
        System.out.println(myStack.pop());
        System.out.println(myStack.pop());
        System.out.println(myStack.pop());
        System.out.println(myStack.pop());
        System.out.println(myStack.pop());
        System.out.println(myStack.pop());

    }
}
